// set
// let s = new Set([1, 2, 2, 3, '3', 4]);
// let s2 = new Set('hello');
// // 两个对象是不想等的 set 是用严格等于 比较的 所以 字符串 和 数字是不想等的
// let s3 = new Set([{},{}])
// console.log(s, s2, s3)

// Symbol.iterator
// const obj = {
//     [Symbol.iterator]: function () {
//         return {
//             next: function () {
//                 return {
//                     value: 1,
//                     done: true
//                 };
//             }
//         };
//     }
// };

// console.log(new Set(obj))

// for (const i of obj) {
//     console.log(i)
// }

// set 实例
// let p = new Set([1,2,3,4]);
// console.log(`p:`);
// console.log(p)
// console.log(`size:`)
// console.log(p.size)
// console.log(`constructor:`)
// console.log(p.constructor)

// // 方法
// let p2 = new Set([1,2,3,4]);
// console.log('set',p2);
// // add 添加数值
// p2.add(5).add(5).add(6);
// // has 判断是否存在这个值
// console.log(p2,p2.has(5))       //0-6   true
// // delete 删除某个值 只能删除一个值
// p2.delete(6)
// console.log(p2);                //0-5 
// // 删除所有值
// p2.clear();
// console.log(p2)                 //为空

// // set 可以用来去除重复数据

// function test(arr){
//     // Array.from 类数组转换为数组
//     // http://es6.ruanyifeng.com/#docs/array#Array-from
//     return Array.from(new Set(arr))
// }

// console.log(test([1,3,4,5,5,3,2]))      // [1, 3, 4, 5, 2] 顺序为改变

// // 循环
// let arr = ['red', 'green', 'blue'];

// // keys()
// for (let i of arr.keys()) {
//     console.log(`keys：${i}`)
// }
// // values()
// // for (let i of arr.values()) {
// //     console.log(`values：${i}`)
// // }
// // entries()
// for (let i of arr.entries()) {
//     console.log(`entries：${i}`)
// }
// // forof
// for (let i of arr) {
//     console.log(`forof：${i}`)
// }
// // foreach
// arr.forEach(e => {
//     console.log(`foreach：${e}`)
// });

// WeakSet
// let arr = [{a:1},{b:2}];
// let arr2 = [[1,2],[3,4]];
// let n = new WeakSet();
// n.add(arr);
// n.add(arr2)
// console.log(n,n.has(arr),n.has(arr2));
// n.delete(arr2);
// console.log(n.has(arr2));

// for (let i of n) {
//     console.log(i)
// }


// n.forEach(e => {
//     console.log(e)
// });

// console.log(n.size,n.length)


// map
// 什么是map
// let m = new Map();
// let a = ['a'];
// let j = {
//     [a]: 333,
// }
// m.set(a, 111);

// m.forEach((e, i) => {
//     console.log(i)
// });

// for (let i in j) {
//     console.log(i)
// }

// map方法
// set 设置值，也可以说添加到map里面去。
// let m = new Map();

// m.set('a',1111);//左边是key 右边是value
// console.log(m);

// // get方法 通过key 获取value
// console.log(m.get('a'));

// // has 查找map 是否包含 这个 key
// console.log(m.has('a'));

// // delete 删除这个key 包括value
// m.delete('a');
// console.log(m);

// // size map里面有几个key
// m.set('b',2222);
// m.set('c',33333);
// console.log(m.size);

// // clear 删除所有对象
// m.clear();
// console.log(m);

// // 什么可以循环map结构
// let m = new Map();
// m.set('a',1111);
// m.forEach(e => {
//     console.log(e);
// });

// for (let i of m) {
//     console.log(i);
// }

// weakMap
let n = new WeakMap();
let j = {};
n.set(j,1111);
console.log(`has：${n.has(j)}`,`get：${n.get(j)}`,n);
n.delete(j);
console.log(n);